package com.itheima.reflect.context;


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class ClasspathApplicationContext implements ApplicationContext {

    // 定义一个容器存储系统中可能使用到的对象
    private ConcurrentHashMap<String, Object> beans = new ConcurrentHashMap<>();

    // 定义构造方法
    public ClasspathApplicationContext(String fileName) throws DocumentException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        // 补全代码

        // 获取配置文件所对应输入流对象

        // 获取解析器对象
        SAXReader saxReader = new SAXReader();


        //  用dom4j解析xml文件
        Document document = saxReader.read(new File("D:\\童老师资料作业\\1.32期共享\\作业\\day16\\素材\\xml\\src\\applicationContext.xml"));

        // 获取根节点对象
        Element rootElement = document.getRootElement();

        //    通过根节点对象获取所有的bean子节点对象
        List<Element> bean = rootElement.elements("bean");
        if (bean == null || bean.size() == 0) {
            return;
        }

        //    遍历集合
        for (Element element : bean) {
            if (element == null) {
                continue;
            }
            //    获取name属性的值，和class属性的值
            Attribute name = element.attribute("name");
            //    获取class的v值
            String text = name.getValue();


            //    获取name属性的值，和class属性的值
            Attribute aClass = element.attribute("class");
            //    获取class的v值
            String text1 = aClass.getValue();

            // 拿全类名获取class对象
            Class clazz = Class.forName(text1);

            Object o = clazz.getConstructor().newInstance();


            beans.put(text, o)                                                                                                   ;

        }


        //    通过反射创建对象存储到beans集合中


    }

    @Override
    public <T> T getBean(Class<T> clazz) {

        // 遍历beans集合
        Collection<Object> values = beans.values();
        for (Object obj : values) {
            if (clazz == obj.getClass()) {       // 判断Class类型是否相当，如果是直接返回该对象即可
                return (T) obj;
            }
        }

        return null;
    }

}
